#ifndef JOUEUR_H_
#define JOUEUR_H_

/* Typedef */
typedef enum {tjLocal,tjRemote,tjUnknown} TypeJoueur;
typedef struct _Joueur Joueur;

/* Includes */
#include "Personnage.h"
#include "Pouvoir.h"
#include <List.h>

/* Constructor */
Joueur* newJoueur();

/* Destructor */
void deleteJoueur(Joueur* j);

/* Getters */
/**
 * \fn Personnage* joueurGetPersos(Joueur* joueur)
 * \brief retourne la liste des personnages appartenant à ce joueur
 * 
 * \param joueur Joueur
 * 
 * \return la liste des personnages appartenant à ce joueur
 */
List* joueurGetPersos(Joueur* joueur);
TypeJoueur joueurGetType(Joueur* joueur);
int joueurGetNumero(Joueur* joueur);
char* joueurGetNom(Joueur* joueur);

/**
 * \fn Personnage* joueurAskChooseEnnemi(Joueur* joueur,List* p)
 * \brief retourne l'ennemi que le joueur désir attaquer
 * \param joueur Joueur
 * \param[out] p Liste des ennemis attaquables
 * \return l'ennemi que le joueur a choisit d'attaquer
 */
Personnage* joueurAskChooseEnnemi(Joueur* joueur,List* p);

/**
 * \fn int joueurHasPerso(Joueur* joueur,Personnage* perso)
 * \brief retourne si le personnage appartient ou non à ce joueur
 * \param joueur Joueur
 * \param perso Personnage
 * \return 1 si le joueur possède ce personnage
 *         0 sinon
 */
int joueurHasPerso(Joueur* joueur,Personnage* perso);

/**
 * \fn void joueurAddPerso(Joueur* joueur,Personnage* perso)
 * \brief ajoute un personnage à un joueur
 * \param joueur Joueur
 * \param perso Personnage
 */
void joueurAddPerso(Joueur* joueur,Personnage* perso);

/**
 * \fn int joueurAskFairePause(Joueur* joueur)
 * \brief demande à un joueur si il souhaite faire une pause
 * \param joueur Joueur
 * \return 1 oui
 * 		   0 non
 */
int joueurAskFairePause(Joueur* joueur);

/**
 * \fn int joueurAskUsePouvoir(Joueur *joueur)
 * \brief Demande à un joueur si il souhaite utiliser son pouvoir
 * 
 * \param joueur Joueur
 * 
 * \return 1 si il le souhaite
 *         0 sinon
 */
int joueurAskUsePouvoir(Joueur* joueur,Pouvoir* pouvoir);

/**
 * \fn Personnage* joueurGetNextHero(Joueur* joueur)
 * \brief Demande au joueur quel est le prochain personnage qu'il souhaite jouer (via joueurAskNextHero)
 * Si un des deux personnages a déja été joué dans ce tour alors
 * aucune demande réelle n'est faite au joueur, de telle sorte que ce soit l'autre personnage
 * (celui n'ayant pas encore joué) qui soit retourné.
 * 
 * \param joueur Joueur
 * 
 * \return Le personnage choisit par le joueur
 */
Personnage* joueurGetNextHero(Joueur* joueur);

/**
 * \fn Personnage* joueurAskNextHero(Joueur* joueur)
 * \brief Demande au joueur de choisir lequel de ses personnages il souhaite utiliser
 * 
 * \param joueur Joueur
 * 
 * \return Le personnage choisit par le joueur
 */
Personnage* joueurAskNextHero(Joueur* joueur);

#endif /*JOUEUR_H_*/
